﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Model;
using Interfaces;
using System.Data;
using System.Collections;


namespace Controller
{
    public class LogSystem
    {
        // Attributter
        private ArbejdslogColl arbejdslogColl;
        private MedarbejderColl medarbejderColl;
        private ProjektColl projektColl;
        private DBFacaden dbFacade;

        // Konstruktør
        public LogSystem()
        {
            arbejdslogColl = new ArbejdslogColl();
            medarbejderColl = new MedarbejderColl();
            projektColl = new ProjektColl();
            dbFacade = new DBFacaden(this);

            dbFacade.IndlæsFraDatabase();    // Indlæs fra database til model under opstart
        }

        #region Operationer på arbejdslog-objekter

        #region Associeringsmetoder

        // metode til at associere et projektobjekt til at arbejdslogobjekt og omvendt
        public void AssocierProjektOgArbejdslog(int projektNr, int arbejdslogID)
        {
            Projekt projekt = projektColl.FindProjekt(projektNr);
            Arbejdslog arbejdslog = arbejdslogColl.FindArbejdslog(arbejdslogID);

            projekt.TilknytArbejdslog(arbejdslog);
            arbejdslog.TilknytProjekt(projekt);
        }

        // metode til at associere et medarbejder til at arbejdslogobjekt og omvendt
        public void AssocierMedarbejderOgArbejdslog(int medarbNr, int arbejdslogID)
        {
            Medarbejder medarbejder = medarbejderColl.FindMedarbejder(medarbNr);
            Arbejdslog arbejdslog = arbejdslogColl.FindArbejdslog(arbejdslogID);

            medarbejder.TilknytArbejdslog(arbejdslog);
            arbejdslog.TilknytMedarbejder(medarbejder);
        }

        #endregion

        // Metode til at indlæse arbejdslogs fra databasen - plus associer projekt-objekter
        public void IndlæsArbejdslogs(int arbejdslogID, DateTime starttidspunkt, DateTime sluttidspunkt, int tid, 
                                        string note, bool aktiv, int projektNr)
        {
            arbejdslogColl.OpretArbejdslog(arbejdslogID, starttidspunkt, sluttidspunkt, tid, note, aktiv);
            AssocierProjektOgArbejdslog(projektNr, arbejdslogID);
        }

        // metode til at indlæse fra ArbejdslogMedarbejder tabellen og associere arbejdslogs og medarbejder
        public void IndlæsArbejdslogMedarbejder(int medarbNr, int arbejdslogID)
        {
            AssocierMedarbejderOgArbejdslog(medarbNr, arbejdslogID);   //gøres på denne måde da vi har en mange til mange relation
        }

        // Metode til at oprette en arbejdslog i systemet og databasen og associere den til et projekt.
        public bool OpretArbejdslogMedProjekt(DateTime starttidspunkt, DateTime sluttidspunkt, int tid, string note, bool aktiv, int projektNr, out int arbejdslogID)
        {
            if (dbFacade.OpretArbejdslogMedProjekt(starttidspunkt, sluttidspunkt, tid, note, aktiv, projektNr, out arbejdslogID))
            {
                arbejdslogColl.OpretArbejdslog(arbejdslogID, starttidspunkt, sluttidspunkt, tid, note, aktiv);
                AssocierProjektOgArbejdslog(projektNr, arbejdslogID);
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at oprette en associering mellem et arbejdslog-objekt og et medarbejder-objekt
        public bool OpretArbejdslogMedarbejder(int medarbNr, int arbejdslogID)
        {
            if (dbFacade.OpretArbejdslogMedarbejder(medarbNr, arbejdslogID))
            {           
                AssocierMedarbejderOgArbejdslog(medarbNr, arbejdslogID);
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at redigere sluttidspunktet på et arbejdslog-objekt
        public bool RedigerSluttid(int arbejdslogID, DateTime sluttidspunkt, int tid)
        {
            if (dbFacade.RedigerSluttid(arbejdslogID, sluttidspunkt, tid))
            {
                arbejdslogColl.RedigerSluttid(arbejdslogID, sluttidspunkt, tid);
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at redigere Noten på et arbejdslog-objekt
        public bool RedigerNote(int arbejdslogID, string note)
        {
            if (dbFacade.RedigerNote(arbejdslogID, note))
            {
                arbejdslogColl.RedigerNote(arbejdslogID, note);
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at Redigere aktiv på et arbejdslog-objekt
        public bool RedigerAktiv(int arbejdslogID, bool aktiv)
        {
            if (dbFacade.RedigerAktiv(arbejdslogID, aktiv))
            {
                arbejdslogColl.RedigerAktiv(arbejdslogID, aktiv);
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at hente arbejdslogs iterator
        public IEnumerator GetArbejdslogs()
        {
            return arbejdslogColl.GetArbejdslogs();
        }

        //metode til at hente titlen på et projekt der er associeret til en arbejdslog
        public string FindArbejdslogsProjektTitel(int arbejdslogID)
        {
            return arbejdslogColl.FindArbejdslogsProjektTitel(arbejdslogID);
        }

        #endregion

        #region operationer på medarbejder-objekter

        // metode til at indlæse fra databasen
        public void IndlæsMedarbejdere(int medarbNr, string navn)
        {
            medarbejderColl.OpretMedarbejder(medarbNr, navn);
        }

        // Metode til at hente liste af medarbejder objekter
        public IEnumerator GetMedarbejdere()
        {
            return medarbejderColl.GetMedarbejdere();
        }

        //kald af metode til at finde et medarbejdernummer ud fra navnet
        public int FindMedarbNrUdFraNavn(string navn)
        {
            return medarbejderColl.FindMedarbNrUdFraNavn(navn);
        }
       
        #endregion

        #region operationer på projekt objekter

        // metode til at indlæse fra databasen
        public void IndlæsProjekter(int projektNr, string titel)
        {
            projektColl.OpretProjekt(projektNr, titel);
        }

        // metode til at hente liste af projekter
        public IEnumerator GetProjekter()
        {
            return projektColl.GetProjekter();
        }

        //metode til at finde et projektnummer ud fra titlen
        public int FindprojektNrUdFraNavn(string titel)
        {
            return projektColl.FindprojektNrUdFraNavn(titel);
        }

        #endregion
    }
}
